package com.tmxk.api.days01.gull.list;

import java.util.ArrayList;
import java.util.List;

/**
 * @Description: ArrayList动态数组集合
 * @Author: gull
 * @CreateTime: 2022-11-28  10:41
 * @Version: 1.0
 */
public class ArrayListDemo {
    public static void main(String[] args) {
        //需求:  一堆数据    1  -9  你好   false   9.99   男
        // 数组定义
        Object[] nums = {1, -9, "你好", false, 9.99, "男"};
        // 数组下标越界 java.lang.ArrayIndexOutOfBoundsException:
        // System.out.println(nums[20]);

        Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
        System.out.println("DEFAULTCAPACITY_EMPTY_ELEMENTDATA:" + DEFAULTCAPACITY_EMPTY_ELEMENTDATA.length);

        // 集合框架中 所有集合包都是在 java.util 包下
        // new ArrayList() 等于 Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};  在内存中开辟一个空房间
        List arrayList = new ArrayList();
        /**
         *  集合添加元素方法
         *  集合名.add(对象元素);   建议使用该方式添加集合元素
         *  集合名.add(下标位置, 对象元素);  通过下标位置添加集合元素需注意:指定下标位置必须依次存在(集合下标位置不能大于集合元素大小)
         **/
        /* ArrayList集合元素中调用add方法时, 底层程序自动扩容原理是:
                ① 当前元素大小是0时, 底层自动开辟10个容量大小空间进行数据存储
                ② 当默认开辟的10个容量大小使用完毕后, 会根据当前集合元素的大小自动扩容到1.5倍
                    底层代码:  grow(minCapacity);
                     private void grow(int minCapacity) {
                        int oldCapacity = elementData.length;
                        int newCapacity = oldCapacity + (oldCapacity >> 1);
                        if (newCapacity - minCapacity < 0)
                            newCapacity = minCapacity;
                        if (newCapacity - MAX_ARRAY_SIZE > 0)
                            newCapacity = hugeCapacity(minCapacity);
                        elementData = Arrays.copyOf(elementData, newCapacity);
                     }
                ③ 依次类推, 自动扩容的容量大小使用完毕后,再根据当前集合元素的大小自动扩容到1.5倍
        */
        arrayList.add(1);
        arrayList.add(1, -9);
        // java.lang.IndexOutOfBoundsException  下标超出指定范围
        arrayList.add("你好1");
        arrayList.add("你好2");
        arrayList.add(true);
        arrayList.add("男");

        // 集合获取大小 :  集合对象名.size();
        System.out.println("ArrayList集合元素的大小(长度):" + arrayList.size());

        // 获取集合对象方法 :  集合对象名.get(index);
        System.out.println("ArrayList集合第一个元素:" + arrayList.get(0));
        System.out.println("ArrayList集合第二个元素:" + arrayList.get(1));
        System.out.println("ArrayList集合第三个元素:" + arrayList.get(2));

        //  E (集合元素 Element)  T(数据类型  Type)   K (键   Key)     V (值    Value)
        // ArrayList集合框架元素默认容量大小  10个
        // System.out.println(Math.max(10, 1));


        // 循环遍历下 ArrayList 集合元素 方式一 : 使用 for i  下标遍历
        System.out.println("---------- ArrayList 集合元素遍历方式一  for i ");
        for (int i = 0; i < arrayList.size(); i++) {
            System.out.println(arrayList.get(i));
        }
        // 需求2: 删除当前集合元素中 1 数据   集合对象名.remove(index); 返回 元素对象类型   集合对象名.remove(obj);  返回boolean类型
        arrayList.remove(arrayList.get(0));   // 通过元素删除
        arrayList.remove(1);          // 通过下标删除
        //  System.out.println(2<<3);

        // 循环遍历下 ArrayList 集合元素 方式二 : 使用 foreach  下标遍历
        System.out.println("---------- ArrayList 集合元素遍历方式二  foreach");
        for (Object obj : arrayList) {
            System.out.println(obj);
        }

        //需求1: 判断当前集合元素中是否存在 你好1 元素
        // 集合对象名.contains(查找的元素);
        boolean isFind = arrayList.contains("你好1");
        String message = isFind == true ? "存在该集合元素" : "不存在该集合元素";
        System.out.println(message);
    }
}







